package com.lmf.rabbitmq.six;

import com.lmf.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 演示 DIRECT型交换机(消费者)：使用 direct 这种类型来进行替换，这种类型的工作方式是，消息只去到它绑定的 routingKey 队列中去。
 */
public class Worker07 {

    //声明交换机的名字
    private static final String EXCHANGE_NAME = "direct_logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        //获取信道
        Channel channel = RabbitMqUtils.getChannel();

        /**
         *   声明交换机:即创建一个交换机
         *      1.交换机名称
         *      2.交换机类型
         */
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);//创建直接类型交换机

        /**
         * 生成一个临时的队列 队列的名称是随机的
         * 当消费者断开和该队列的连接时 队列自动删除
         */
        String queue = channel.queueDeclare().getQueue();

        //把该临时队列绑定我们的 exchange 其中 routingkey(也称之为 binding key)为空字符串
        //可以给同一个队列进行多重绑定
        channel.queueBind(queue,EXCHANGE_NAME,"error");

        //成功回调函数
        DeliverCallback deliverCallback = (consumerTag, message) ->{
            System.out.println("控制台打印接收到的消息:" + new String(message.getBody()));
        };
        System.out.println("c2等待接收消息,把接收到的消息打印在屏幕........... ");
        //接收消息
        channel.basicConsume(queue,true,deliverCallback,(consumerTag) ->{});


    }
}
